/**
  * @File    :   bh1750fvi.c
  * @Time    :   2020/04/02 13:54:35
  * @Author  :   huenrong
  */

#include "bh1750fvi.h"
#include "../i2c/i2c.h"

/**
  * @name   bh1750fvi_read_light
  * @brief  bh1750fvi读取光照强度
  * @param  read_light: 读取到的光照强度值(单位: lux)
  * @param  fd: 设备文件描述符
  * @retval 成功: 返回0
            失败: 返回-1
  */
int bh1750fvi_read_light(float *read_light, const int fd)
{
    int ret = -1;
    uint8_t send_data[10] = {0};
    uint8_t bh1750fvi_read_data[4] = {0};

    // 设置从器件地址
    // 不带寄存器地址的从设备操作前需要先设置从器件地址
    ret = ioctl(fd, I2C_SLAVE_FORCE, BH1750FVI_I2C_ADDR);
    if (ret < 0)
    {
        perror("bh1750fvi set slave addr fail");

        return -1;
    }

    // bh1750fvi打开模块等待测量指令
    send_data[0] = BH1750FVI_POWON;
    ret = i2c_write_data(fd, send_data, 1);
    if (0 != ret)
    {
        printf("bh1750fvi power on fail\n");
    }

    // bh1750fvi高分辨率测量 单位: lux 测量时间120ms
    send_data[0] = BH1750FVI_MODE_H1;
    ret = i2c_write_data(fd, send_data, 1);
    if (0 != ret)
    {
        printf("bh1750fvi set mode fail\n");
    }

    // bh1750fvi读取温湿度数据
    memset(bh1750fvi_read_data, 0, sizeof(bh1750fvi_read_data));
    ret = i2c_read_data(fd, 3, bh1750fvi_read_data);
    if (0 != ret)
    {
        printf("bh1750fvi read data fail\n");
    }

    // 计算光照强度值(单位: lux)
    *read_light = ((bh1750fvi_read_data[0] * 256 + bh1750fvi_read_data[1]) / 1.2);

    return 0;
}
